package bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlInputText;

import mensagem.MsgVenda;
import session.SessionCliente;
import session.SessionCondPagamento;
import session.SessionContaReceber;
import session.SessionFormaPagamento;
import session.SessionItemVenda;
import session.SessionProduto;
import session.SessionVenda;
import entity.Cliente;
import entity.CondPagamento;
import entity.ContaReceber;
import entity.ItemVenda;
import entity.Produto;
import entity.Venda;

@ManagedBean
@SessionScoped
public class BeanVenda {

	private Venda venda = new Venda();

	private Venda filtro = new Venda();

	private List<Venda> vendas = new ArrayList<Venda>();

	private ItemVenda item = new ItemVenda();

	private List<ItemVenda> itens = new ArrayList<ItemVenda>();

	private SessionVenda session = new SessionVenda();

	private SessionCliente sessionC = new SessionCliente();

	private SessionCondPagamento sessionCond = new SessionCondPagamento();

	private SessionProduto sessionP = new SessionProduto();

	private SessionContaReceber sessionConta = new SessionContaReceber();

	private SessionItemVenda sessionItem = new SessionItemVenda();

	private ContaReceber conta = new ContaReceber();

	private List<ContaReceber> contas = new ArrayList<ContaReceber>();

	private HtmlInputText produto;

	private HtmlInputText condPagamento;

	private HtmlInputText cliente;

	// //////////////////////////CONSTRUCTOR//////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public BeanVenda() {
		this.venda.setTotal(new Float(0));
	}

	// //////////////////////////CONSTRUCTOR//////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public Venda getVenda() {
		return venda;
	}

	public void setVenda(Venda venda) {
		this.venda = venda;
	}

	public Venda getFiltro() {
		return filtro;
	}

	public void setFiltro(Venda filtro) {
		this.filtro = filtro;
	}

	public SessionCliente getSessionC() {
		return sessionC;
	}

	public void setSessionC(SessionCliente sessionC) {
		this.sessionC = sessionC;
	}

	public List<Venda> getVendas() {
		return vendas;
	}

	public void setVendas(List<Venda> vendas) {
		this.vendas = vendas;
	}

	public ItemVenda getItem() {
		return item;
	}

	public void setItem(ItemVenda item) {
		this.item = item;
	}

	public List<ItemVenda> getItens() {
		return itens;
	}

	public void setItens(List<ItemVenda> itens) {
		this.itens = itens;
	}

	public SessionVenda getSession() {
		return session;
	}

	public void setSession(SessionVenda session) {
		this.session = session;
	}

	public SessionCondPagamento getSessionCond() {
		return sessionCond;
	}

	public void setSessionCond(SessionCondPagamento sessionCond) {
		this.sessionCond = sessionCond;
	}

	public SessionProduto getSessionP() {
		return sessionP;
	}

	public void setSessionP(SessionProduto sessionP) {
		this.sessionP = sessionP;
	}

	public SessionContaReceber getSessionConta() {
		return sessionConta;
	}

	public void setSessionConta(SessionContaReceber sessionConta) {
		this.sessionConta = sessionConta;
	}

	public SessionItemVenda getSessionItem() {
		return sessionItem;
	}

	public void setSessionItem(SessionItemVenda sessionItem) {
		this.sessionItem = sessionItem;
	}

	public ContaReceber getConta() {
		return conta;
	}

	public void setConta(ContaReceber conta) {
		this.conta = conta;
	}

	public List<ContaReceber> getContas() {
		return contas;
	}

	public void setContas(List<ContaReceber> contas) {
		this.contas = contas;
	}

	public HtmlInputText getProduto() {
		return produto;
	}

	public void setProduto(HtmlInputText produto) {
		this.produto = produto;
	}

	public HtmlInputText getCondPagamento() {
		return condPagamento;
	}

	public void setCondPagamento(HtmlInputText condPagamento) {
		this.condPagamento = condPagamento;
	}

	public HtmlInputText getCliente() {
		return cliente;
	}

	public void setCliente(HtmlInputText cliente) {
		this.cliente = cliente;
	}

	// ///////////////////////////////METODOS/////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public void reinit() {
		this.setVenda(new Venda());
		this.setVendas(new ArrayList<Venda>());
		this.setItens(new ArrayList<ItemVenda>());
		this.setItem(new ItemVenda());
		this.setFiltro(new Venda());
		this.produto.setValue("");
		this.condPagamento.setValue("");
		this.cliente.setValue("");
		this.venda.setTotal(new Float(0));
	}

	public void reinitParcial() {
		this.setItem(new ItemVenda());
		this.produto.setValue("");
	}

	public void reinitCond() {
		this.venda.setCondPagamento(new CondPagamento());
		this.condPagamento.setValue("");
		this.venda.setTotal(null);
		this.venda.setSubTotal(null);
	}

	public String save() throws Exception {
		if (this.venda.getId() != null) {
			return this.update();
		} else {
			if (this.session.save(this.venda)) {
				for (int i = 0; i < contas.size(); i++) {
					this.contas.get(i).setVenda(this.venda);
					this.sessionConta.save(this.contas.get(i));
				}
				for (int i = 0; i < itens.size(); i++) {
					this.itens.get(i).setVenda(this.venda);
					this.sessionItem.save(this.itens.get(i));
				}
				this.reinit();
				MsgVenda.msgSave();
			}
		}
		return "";
	}

	public String update() throws Exception {
		if (this.session.update(this.venda)) {
			this.reinit();
			MsgVenda.msgUpdate();
		}
		return null;
	}

	public String cancela() {
		try {
			this.session.cancela(venda);
			MsgVenda.msgRemove();
		} catch (Exception e) {
			MsgVenda.msgNotRemove();
		}
		return null;
	}

	public void find() throws Exception {
		this.vendas = this.session.find(filtro);
	}

	public void addItem() {
		if (this.validaItem()) {
			this.item.setPrecoUni(this.item.getProduto().getPrecoVenda());
			this.item.setValor((this.item.getPrecoUni() * this.item
					.getQuantidade()) - item.getDesconto());
			this.itens.add(item);
			this.venda
					.setSubTotal(this.venda.getTotal() + this.item.getValor());
			this.atualizaTotal();
			this.reinitParcial();
		}
	}

	private boolean validaItem() {
		try {
			//this.sessionP.update(this.item.getProduto());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}

	public void removeItem() {
		this.itens.remove(this.item);
		this.venda.setSubTotal(this.venda.getSubTotal() - this.item.getValor());
		this.atualizaTotal();
		this.reinitParcial();
	}
	
	public void atualizaTotal(){
		if (this.venda.getDesconto() != null) {
			this.venda.setTotal(this.venda.getSubTotal() - venda.getDesconto());
		}else {
			this.venda.setTotal(this.venda.getSubTotal());
		}
	}
	
	public void geraConta() {
		this.contas = new ArrayList<ContaReceber>();
		if (this.validaConta()) {
			for (int i = 0; i < this.venda.getCondPagamento().getParcelas()
					.size(); i++) {
				this.conta.setValor(this.venda.getTotal()
						* (this.venda.getCondPagamento().getParcelas().get(i)
								.getPerc() / 100));
				this.conta.setVenda(this.venda);
				this.conta.setVencimento(new Date());
				this.conta.getVencimento().setDate(
						this.venda.getEmissao().getDate()
								+ this.venda.getCondPagamento().getParcelas()
										.get(i).getDias());
				this.conta.setNumero(this.contas.size() + 1);
				this.contas.add(this.conta);
				this.conta = new ContaReceber();
			}
		}
	}

	private boolean validaConta() {
		this.venda.setEmissao(new Date());
		return true;
	}

	public String hotFindCondicao() {
		if (this.venda.getCondPagamento() != null) {
			if ((this.venda.getCondPagamento().getId() != null)
					&& (this.venda.getCondPagamento().getDescricao() != null)) {
				int aux = this.venda.getCondPagamento().getId();
				this.venda.setCondPagamento(new CondPagamento());
				this.venda.getCondPagamento().setId(aux);
			}
		}

		if ((this.venda.getCondPagamento() != null)
				&& (this.venda.getCondPagamento().getId() != null)) {
			try {
				this.venda.setCondPagamento(this.sessionCond.getController()
						.find(this.venda.getCondPagamento()));
			} catch (Exception e) {
				this.venda.setCondPagamento(new CondPagamento());
			}
			if ((this.venda.getCondPagamento() != null)
					&& (venda.getCondPagamento().getDescricao() != null)) {
				this.condPagamento.setValue(venda.getCondPagamento()
						.getDescricao());
				return null;
			}
		}
		this.venda.setCondPagamento(new CondPagamento());
		return null;
	}

	public String hotFindCliente() {
		if (this.venda.getCliente() != null) {
			if ((this.venda.getCliente().getId() != null)
					&& (this.venda.getCliente().getNome() != null)) {
				int aux = this.venda.getCliente().getId();
				this.venda.setCliente(new Cliente());
				this.venda.getCliente().setId(aux);
			}
		}

		if ((this.venda.getCliente() != null)
				&& (this.venda.getCliente().getId() != null)) {
			try {
				this.venda.setCliente(this.sessionC.getController().find(
						this.venda.getCliente()));
			} catch (Exception e) {
				this.venda.setCliente(new Cliente());
			}
			if ((this.venda.getCliente() != null)
					&& (venda.getCliente().getNome() != null)) {
				this.cliente.setValue(venda.getCliente().getNome());
				return null;
			}
		}
		this.venda.setCliente(new Cliente());
		return null;
	}

	public String hotFindProduto() {
		if (this.item.getProduto() != null) {
			if ((this.item.getProduto().getId() != null)
					&& (this.item.getProduto().getDescricao() != null)) {
				int aux = this.item.getProduto().getId();
				this.item.setProduto(new Produto());
				this.item.getProduto().setId(aux);
			}
		}

		if ((this.item.getProduto() != null)
				&& (this.item.getProduto().getId() != null)) {
			try {
				this.item.setProduto(this.sessionP.getController().find(
						this.item.getProduto()));
			} catch (Exception e) {
				this.item.setProduto(new Produto());
			}
			if ((this.item.getProduto() != null)
					&& (item.getProduto().getDescricao() != null)) {
				this.produto.setValue(item.getProduto().getDescricao());
				return null;
			}
		}
		this.item.setProduto(new Produto());
		return null;
	}

}
